home *** CD-ROM | disk | FTP | other *** search
/ Australian Personal Computer 2000 July / CD 3 / redhat-6.2.iso / RedHat / instimage / usr / lib / anaconda / textw / userauth.py < prev   
Encoding:
Python Source  |  2000-03-08  |  11.0 KB  |  308 lines

  1. #import gettext_rh
  2. from snack import *
  3. from textw.constants import *
  4. from translate import _
  5. import iutil
  6.  
  7. class RootPasswordWindow:
  8.     def __call__ (self, screen, todo):
  9.         toplevel = GridForm (screen, _("Root Password"), 1, 3)
  10.  
  11.         toplevel.add (TextboxReflowed(37, _("Pick a root password. You must "
  12.                 "type it twice to ensure you know "
  13.                 "what it is and didn't make a mistake "
  14.                 "in typing. Remember that the "
  15.                 "root password is a critical part "
  16.                 "of system security!")), 0, 0, (0, 0, 0, 1))
  17.  
  18.     pw = todo.rootpassword.getPure()
  19.     if not pw: pw = ""
  20.  
  21.         entry1 = Entry (24, hidden = 1, text = pw)
  22.         entry2 = Entry (24, hidden = 1, text = pw)
  23.         passgrid = Grid (2, 2)
  24.         passgrid.setField (Label (_("Password:")), 0, 0, (0, 0, 1, 0), anchorLeft = 1)
  25.         passgrid.setField (Label (_("Password (again):")), 0, 1, (0, 0, 1, 0), anchorLeft = 1)
  26.         passgrid.setField (entry1, 1, 0)
  27.         passgrid.setField (entry2, 1, 1)
  28.         toplevel.add (passgrid, 0, 1, (0, 0, 0, 1))
  29.         
  30.         bb = ButtonBar (screen, ((_("OK"), "ok"), (_("Back"), "back")))
  31.         toplevel.add (bb, 0, 2, growx = 1)
  32.  
  33.         while 1:
  34.             toplevel.setCurrent (entry1)
  35.             result = toplevel.run ()
  36.             rc = bb.buttonPressed (result)
  37.             if rc == "back":
  38.                 screen.popWindow()
  39.                 return INSTALL_BACK
  40.             if len (entry1.value ()) < 6:
  41.                 ButtonChoiceWindow(screen, _("Password Length"),
  42.                _("The root password must be at least 6 characters "
  43.              "long."),
  44.                buttons = [ _("OK") ], width = 50)
  45.             elif entry1.value () != entry2.value ():
  46.                 ButtonChoiceWindow(screen, _("Password Mismatch"),
  47.                _("The passwords you entered were different. Please "
  48.              "try again."),
  49.                buttons = [ _("OK") ], width = 50)
  50.             else:
  51.                 break
  52.  
  53.             entry1.set ("")
  54.             entry2.set ("")
  55.  
  56.         screen.popWindow()
  57.         todo.rootpassword.set (entry1.value ())
  58.         return INSTALL_OK
  59.  
  60. class UsersWindow:
  61.     def editWindow (self, user, text, edit = 0, cancelText = None):
  62.     if (not cancelText):
  63.         cancelText = _("Cancel")
  64.  
  65.         userid = Entry (9, user["id"])
  66.         currentid = user["id"]
  67.         fullname = Entry (20, user["name"], scroll = 1)
  68.         pass1 = Entry (10, user["password"], hidden = 1)
  69.         pass2 = Entry (10, user["password"], hidden = 1)
  70.  
  71.     if edit:
  72.         title = _("Edit User")
  73.     else:
  74.         title = _("Add User")
  75.  
  76.         while 1:
  77.             (rc, ent) = EntryWindow (self.screen, title, text,
  78.              [ (_("User ID"), userid),
  79.                (_("Full Name"), fullname),
  80.                (_("Password"), pass1),
  81.                (_("Password (confirm)"), pass2) ],
  82.              buttons = [ (_("OK"), "ok"), (cancelText, "cancel") ])
  83.             
  84.             if rc == "cancel":
  85.                 return INSTALL_BACK
  86.         if not len(pass1.value()) and not len(pass2.value()) and \
  87.            not len(userid.value()) and not len(fullname.value()):
  88.                 return INSTALL_OK
  89.  
  90.             if (not iutil.validUser(userid.value())):
  91.         ButtonChoiceWindow(self.screen, _("Bad User ID"),
  92.                                    _("User IDs must be less than 8 "
  93.                                      "characters and contain only characters "
  94.                                      "A-Z, a-z, and 0-9."),
  95.                                    buttons = [ _("OK") ], width = 50)
  96.         continue
  97.                 
  98.         if not userid.value ():
  99.         ButtonChoiceWindow(self.screen, _("Missing User ID"),
  100.                                    _("You must provide a user ID"),
  101.                                    buttons = [ _("OK") ], width = 50)
  102.         continue
  103.         if len (pass1.value ()) < 6:
  104.         ButtonChoiceWindow(self.screen, _("Password Length"),
  105.                _("The password must be at least 6 characters "
  106.              "long."),
  107.                buttons = [ _("OK") ], width = 50)
  108.         pass1.set ("")
  109.         pass2.set ("")
  110.         continue
  111.         elif pass1.value () != pass2.value ():
  112.         ButtonChoiceWindow(self.screen, _("Password Mismatch"),
  113.            _("The passwords you entered were different. Please "
  114.              "try again."),
  115.            buttons = [ _("OK") ], width = 50)
  116.         pass1.set ("")
  117.         pass2.set ("")
  118.         continue
  119.  
  120.             if self.users.has_key (userid.value ()) and  \
  121.                    userid.value () != currentid:
  122.                 ButtonChoiceWindow(self.screen, _("User Exists"),
  123.                _("This user id already exists.  Choose another."),
  124.              buttons = [ _("OK") ], width = 50)
  125.                 continue
  126.  
  127.             # XXX FIXME - more data validity checks
  128.             
  129.             user["id"] = userid.value ()
  130.             user["name"] = fullname.value ()
  131.             user["password"] = pass1.value ()
  132.             break
  133.  
  134.     return INSTALL_OK
  135.  
  136.     def __call__ (self, screen, todo):
  137.         self.users = {}
  138.         self.screen = screen
  139.     user = { "id" : "", "name" : "", "password" : "" }
  140.  
  141.     for (account, name, password) in todo.getUserList():
  142.         user['id'] = account
  143.         user['name'] = name
  144.         user['password'] = password
  145.         self.users[account] = user
  146.         del user
  147.         user = { "id" : "", "name" : "", "password" : "" }
  148.  
  149.     if not self.users.keys():
  150.         rc = self.editWindow(user, _("You should use a normal user "
  151.         "account for most activities on your system. By not using the "
  152.         "root account casually, you'll reduce the chance of "
  153.         "disrupting your system's configuration."), 
  154.         cancelText = _("Back"))
  155.         if (rc == INSTALL_BACK):
  156.         return INSTALL_BACK
  157.         if (not user['id']):
  158.         return INSTALL_OK
  159.         self.users[user["id"]] = user
  160.         
  161.         g = GridForm (screen, _("User Account Setup"), 1, 4)
  162.  
  163.     t = TextboxReflowed(60, _("What user account would you like to have "
  164.         "on the system? You should have at least one non-root account "
  165.         "for normal work, but multi-user systems can have any number "
  166.         "of accounts set up."))
  167.     g.add(t, 0, 0, anchorLeft = 1, padding = (0, 0, 0, 1))
  168.  
  169.         listformat = "%-15s  %-40s"
  170.         userformat = "%(id)-15s  %(name)-40s"
  171.  
  172.     subgrid = Grid(1, 2)
  173.         header = listformat % (_("User name"), _("Full Name"))
  174.         label = Label (header)
  175.         subgrid.setField (label, 0, 0, anchorLeft = 1)
  176.         listbox = Listbox (5, scroll = 1, returnExit = 1, width = 54)
  177.         subgrid.setField (listbox, 0, 1, (0, 0, 0, 1), anchorLeft = 1)
  178.  
  179.     g.add(subgrid, 0, 1)
  180.  
  181.         for user in self.users.values ():
  182.             listbox.append (userformat % user, user["id"])
  183.  
  184.         bb = ButtonBar (screen, ((_("Add"), "add"), (_("Delete"), "delete"),
  185.                                  (_("Edit"), "edit"), (_("OK"), "ok"), (_("Back"), "back")))
  186.         
  187.         g.add (bb, 0, 3, growx = 1)
  188.  
  189.         while 1:
  190.             result = g.run ()
  191.             
  192.             rc = bb.buttonPressed (result)
  193.  
  194.             if rc == "add":
  195.                 user = { "id" : "", "name" : "", "password" : "" }
  196.                 if self.editWindow (user, 
  197.                     _("Enter the information for the user."), 0) != INSTALL_BACK:
  198.                     listbox.append (userformat % user, user["id"])
  199.                     listbox.setCurrent (user["id"])
  200.                     self.users[user["id"]] = user
  201.             elif rc == "delete":
  202.                 current = listbox.current ()
  203.                 listbox.delete (current)
  204.                 del self.users [current]
  205.             elif rc == "edit" or result == listbox:
  206.         current = listbox.current()
  207.                 user = self.users[current]
  208.                 if self.editWindow (user, 
  209.             _("Change the information for this user."), 1) != INSTALL_BACK:
  210.                     # if the user id changed, we need to delete the old key
  211.                     # and insert this new one.
  212.                     if user["id"] != current:
  213.                         del self.users [current]
  214.                         listbox.insert (userformat % user, user["id"], current)
  215.                         listbox.delete (current)
  216.                     # and if the user id didn't change, just replace the old
  217.                     # listbox entry.
  218.                     else:
  219.                         listbox.replace (userformat % user, user["id"])
  220.                     self.users [user["id"]] = user
  221.                     listbox.setCurrent(user["id"])
  222.             elif rc == "ok" or result == "F12":
  223.                 dir = INSTALL_OK
  224.                 break
  225.             elif rc == "back":
  226.                 dir = INSTALL_BACK
  227.                 break
  228.             else:
  229.                 raise NeverGetHereError, "I shouldn't be here w/ rc %s..." % rc
  230.                 
  231.         screen.popWindow ()
  232.  
  233.         list = []
  234.         for n in self.users.values():
  235.         info = ( n['id'], n['name'], n['password'] )
  236.         list.append(info)
  237.  
  238.     todo.setUserList(list)
  239.  
  240.         return dir
  241.  
  242. class AuthConfigWindow:
  243.     def setsensitive (self):
  244.         server = FLAGS_RESET
  245.         flag = FLAGS_RESET
  246.         if self.broadcast.selected ():
  247.             server = FLAGS_SET
  248.         if not self.nis.selected ():
  249.             flag = FLAGS_SET
  250.             server = FLAGS_SET
  251.  
  252.         self.domain.setFlags (FLAG_DISABLED, flag)
  253.         self.broadcast.setFlags (FLAG_DISABLED, flag)
  254.         self.server.setFlags (FLAG_DISABLED, server)
  255.  
  256.     def __call__(self, screen, todo):
  257.         bb = ButtonBar (screen, ((_("OK"), "ok"), (_("Back"), "back")))
  258.  
  259.         toplevel = GridForm (screen, _("Authentication Configuration"), 1, 5)
  260.         self.shadow = Checkbox (_("Use Shadow Passwords"), todo.auth.useShadow)
  261.         toplevel.add (self.shadow, 0, 0, (0, 0, 0, 1), anchorLeft = 1)
  262.         self.md5 = Checkbox (_("Enable MD5 Passwords"), todo.auth.useMD5)
  263.         toplevel.add (self.md5, 0, 1, (0, 0, 0, 1), anchorLeft = 1)
  264.         self.nis = Checkbox (_("Enable NIS"), todo.auth.useNIS)
  265.         toplevel.add (self.nis, 0, 2, anchorLeft = 1)
  266.  
  267.         subgrid = Grid (2, 3)
  268.  
  269.         subgrid.setField (Label (_("NIS Domain:")),
  270.                           0, 0, (0, 0, 1, 0), anchorRight = 1)
  271.         subgrid.setField (Label (_("NIS Server:")),
  272.                           0, 1, (0, 0, 1, 0), anchorRight = 1)
  273.         subgrid.setField (Label (_("or use:")),
  274.                           0, 2, (0, 0, 1, 0), anchorRight = 1)
  275.  
  276.         text = _("Request server via broadcast")
  277.         self.domain = Entry (len (text) + 4)
  278.         self.domain.set (todo.auth.domain)
  279.         self.broadcast = Checkbox (text, todo.auth.useBroadcast)
  280.         self.server = Entry (len (text) + 4)
  281.         self.server.set (todo.auth.server)
  282.         subgrid.setField (self.domain, 1, 0, anchorLeft = 1)
  283.         subgrid.setField (self.broadcast, 1, 1, anchorLeft = 1)
  284.         subgrid.setField (self.server, 1, 2, anchorLeft = 1)
  285.         toplevel.add (subgrid, 0, 3, (2, 0, 0, 1))
  286.         toplevel.add (bb, 0, 4, growx = 1)
  287.  
  288.         self.nis.setCallback (self.setsensitive)
  289.         self.broadcast.setCallback (self.setsensitive)
  290.  
  291.         self.setsensitive ()
  292.  
  293.         result = toplevel.runOnce ()
  294.  
  295.         todo.auth.useMD5 = self.md5.value ()
  296.         todo.auth.useShadow = self.shadow.value ()
  297.         todo.auth.useNIS = self.nis.selected ()
  298.         todo.auth.domain = self.domain.value ()
  299.         todo.auth.useBroadcast = self.broadcast.selected ()
  300.         todo.auth.server = self.server.value ()
  301.                 
  302.         rc = bb.buttonPressed (result)
  303.  
  304.         if rc == "back":
  305.             return INSTALL_BACK
  306.         return INSTALL_OK
  307.  
  308.